home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 2 / LSD and 17bit Compendium Deluxe - Volume II.iso / a / prog / asmsrc / icsources.lha / PROGRAMS / FLD < prev    next >
Encoding:
Text File  |  1990-06-23  |  19.0 KB  |  879 lines

  1.      
  2.      section ax,code_c
  3.     opt c-,d+,w-,o+    
  4.     
  5.     include 'df1:insert/custom registers'
  6.     
  7. badd=(320*256)/8
  8.  
  9.     jsr bpinit
  10.     move.l #table,karst
  11.     move.l #table1,karst1
  12.     move.l #table2,karst2
  13.     move.l #table3,karst3
  14.     move.l #table4,karst4
  15.     move.l #table5,karst5
  16.     lea $dff000,a4
  17.     move.w #$87e0,dmacon(a4)
  18.     jsr cop_init
  19.      move.l $6c,oldirq
  20.      move.l #newirq,$6c
  21. mse:
  22.      cmp.b #$f0,$dff006
  23.      bne mse
  24.      
  25. zog:
  26.      btst #6,$bfe001
  27.     bne mse
  28.     move.w #$0f,$dff096
  29.      move.l oldirq,$6c
  30.      move.l copaddr,a0
  31.      move.l oldcop,(a0)
  32. nolib:    
  33.      rts    
  34. newirq:  
  35.     movem.l d0-d7/a0-a6,$75000
  36.     cmpi.w #$0fff,colo
  37.     beq fre
  38.     cmpi.b #4,county
  39.     bne fre
  40.     move.b #0,county
  41.     addi.w #$0111,colo
  42. fre:
  43.     jsr reader5
  44.     jsr reader4
  45.     jsr reader
  46.     jsr reader1
  47.     jsr reader2
  48.     jsr reader3
  49.     addi.b #1,county
  50.     jsr bpmusic
  51.     movem.l $75000,d0-d7/a0-a6
  52.     dc.w $4ef9
  53.     
  54. oldirq: dc.l 0
  55. karst:    dc.l 0
  56. karst1: dc.l 0
  57. karst2:    dc.l 0
  58. karst3: dc.l 0
  59. karst4: dc.l 0
  60. karst5: dc.l 0
  61. county:    dc.b 0
  62.  
  63.  
  64.     even
  65.  
  66. cop_init:
  67.      
  68.      lea screen,a0
  69.      move.l a0,d0
  70.      move.w d0,lo1
  71.      swap d0
  72.      move.w d0,hi1
  73.      
  74.      lea chrset+640+2,a0
  75.      move.l a0,d0
  76.      move.w d0,elo1
  77.      swap d0
  78.      move.w d0,ehi1
  79.      
  80.      lea chrset+1280+2,a0
  81.      move.l a0,d0
  82.      move.w d0,clo1
  83.      swap d0
  84.      move.w d0,chi1
  85.      
  86.      lea chrset+1920+2,a0
  87.      move.l a0,d0
  88.      move.w d0,alo1
  89.      swap d0
  90.      move.w d0,ahi1
  91.      
  92.      lea chrset+2560+2,a0
  93.      move.l a0,d0
  94.      move.w d0,blo1
  95.      swap d0
  96.      move.w d0,bhi1
  97.      
  98.      lea chrset+3200+2,a0
  99.      move.l a0,d0
  100.      move.w d0,dlo1
  101.      swap d0
  102.      move.w d0,dhi1
  103.      
  104.      lea chrset+2,a0
  105.      move.l a0,d0
  106.      move.w d0,flo1
  107.      swap d0
  108.      move.w d0,fhi1
  109.      
  110.      moveq #$00,d0
  111.      lea grafname,a1
  112.      move.l $4,a6
  113.      jsr -132(A6)
  114.      move.l $4,A6
  115.      jsr -408(a6)
  116.      tst d0
  117.      beq nolib
  118.      move.l d0,grafbase
  119.      move.l d0,a6
  120.      add.l #$32,d0
  121.      move.l d0,a0
  122.      move.l a0,copaddr
  123.      move.l (a0),oldcop
  124.      move.l #newcop,(a0)
  125.      rts
  126.  
  127.     even
  128.       
  129. grafname: dc.b "graphics.library",0
  130. grafbase: dc.l 0
  131. oldcop:   dc.l 0
  132. copaddr:  dc.l 0
  133. yaz:      dc.w 0
  134.  
  135.     even
  136.  
  137. newcop:     dc.w $0100,$1200
  138.       dc.w $0102
  139. boh:      dc.w $00ff
  140.      dc.w $0120
  141. sp1l:     dc.w $0000,$0122
  142. sp1h:      dc.w $0000 
  143.      dc.w $0124
  144. sp2l:     dc.w $0000,$0126
  145. sp2h:      dc.w $0000 
  146.      dc.w $0128
  147. sp3l:     dc.w $0000,$012a
  148. sp3h:      dc.w $0000 
  149.      dc.w $012c
  150. sp4l:     dc.w $0000,$012e
  151. sp4h:      dc.w $0000
  152.      dc.w $0130
  153. sp5l:     dc.w $0000,$132
  154. sp5h:      dc.w $0000
  155.  scr:       dc.w $2001,$fffe
  156.       dc.w $00e0
  157.  hi1:     dc.w $0000
  158.      dc.w $00e2
  159.  lo1:     dc.w $0000
  160.      dc.w $008e,$3021 
  161.      dc.w $0090,$30f1
  162.      dc.w $180,$000
  163.      dc.w $182
  164. colo:     dc.w $000,$184,$fdb,$186,$db9
  165.      dc.w $188,$c97,$18a,$a75,$18c,$853,$18e,$033,$190,$c60
  166.      dc.w $192,$ba5,$194,$962,$196,$530,$198,$db4,$19a,$558
  167.      dc.w $19c,$447,$19e,$336,$1a0,$a40,$1a2,$f44,$1a4,$b00
  168.      dc.w $1a6,$222,$1a8,$333,$1aa,$444,$1ac,$555,$1ae,$666
  169.      dc.w $1b0,$777,$1b2,$888,$1b4,$999,$1b6,$aaa,$1b8,$ccc
  170.      dc.w $1ba,$ddd,$1bc,$eee,$1be,$fff
  171.  
  172. goob5:     dc.w $8401,$fffe
  173.      dc.w $00e0
  174. fhi1:     dc.w $0000
  175.      dc.w $00e2
  176. flo1:     dc.w $0000 
  177. goob4:     dc.w $8c01,$fffe
  178.      dc.w $00e0
  179. ehi1:     dc.w $0000
  180.      dc.w $00e2
  181. elo1:     dc.w $0000     
  182.      dc.w $0180,$0000
  183. goob:     dc.w $9401,$fffe
  184.      dc.w $0180,$0000
  185.      dc.w $00e0
  186. chi1:     dc.w $0000
  187.      dc.w $00e2
  188. clo1:     dc.w $0000
  189.     
  190. goob1:   dc.w $9c01,$fffe
  191.      dc.w $0180,$0000
  192.      dc.w $00e0
  193. ahi1:     dc.w $0000
  194.      dc.w $00e2
  195. alo1:     dc.w $0000     
  196.     
  197. goob2:     dc.w $a401,$fffe
  198.      dc.w $00e0
  199. bhi1:     dc.w $0000
  200.      dc.w $00e2
  201. blo1:     dc.w $0000     
  202.     
  203.      dc.w $0180,$0000
  204. goob3:     dc.w $ac01,$fffe
  205.      dc.w $00e0
  206. dhi1:     dc.w $0000
  207.      dc.w $00e2
  208. dlo1:     dc.w $0000     
  209.     
  210.      dc.w $0180,$0000
  211.  
  212.      dc.w $ffff,$fffe
  213.      
  214.      even
  215.  
  216. screen:
  217.      ds.b 1*badd
  218.  
  219. chrset:
  220.      incbin 'df1:graphics/17bit.raw'
  221.  
  222. reader:
  223.     move.l karst,a3
  224.     move.w (a3)+,yaz
  225.     cmpi.w #$0,yaz
  226.     bne cdo
  227.     move.l #table,karst
  228.     rts
  229. cdo:
  230.     move.w yaz,goob
  231.     move.l a3,karst
  232.     rts
  233.     
  234. reader1:
  235.     
  236.     move.l karst1,a3
  237.     move.w (a3)+,yaz
  238.     cmpi.w #$0,yaz
  239.     bne cdo1
  240.     move.l #table1,karst1
  241.     rts
  242. cdo1:
  243.     move.w yaz,goob1
  244.     move.l a3,karst1
  245.     rts
  246.         
  247. reader2:
  248.     
  249.     move.l karst2,a3
  250.     move.w (a3)+,yaz
  251.     cmpi.w #$0,yaz
  252.     bne cdo2
  253.     move.l #table2,karst2
  254.     rts
  255. cdo2:
  256.     move.w yaz,goob2
  257.     move.l a3,karst2
  258.     rts
  259.  
  260.         
  261. reader3:
  262.     
  263.     move.l karst3,a3
  264.     move.w (a3)+,yaz
  265.     cmpi.w #$0,yaz
  266.     bne cdo3
  267.     move.l #table3,karst3
  268.     rts
  269. cdo3:
  270.     move.w yaz,goob3
  271.     move.l a3,karst3
  272.     rts    
  273.     
  274.         
  275. reader4:
  276.     
  277.     move.l karst4,a3
  278.     move.w (a3)+,yaz
  279.     cmpi.w #$0,yaz
  280.     bne cdo4
  281.     move.l #table4,karst4
  282.     rts
  283. cdo4:
  284.     move.w yaz,goob4
  285.     move.l a3,karst4
  286.     rts    
  287.     
  288. reader5:
  289.     
  290.     move.l karst5,a3
  291.     move.w (a3)+,yaz
  292.     cmpi.w #$0,yaz
  293.     bne cdo5
  294.     move.l #table5,karst5
  295.     rts
  296. cdo5:
  297.     move.w yaz,goob5
  298.     move.l a3,karst5
  299.     rts    
  300.     
  301. table:
  302.     dc.w $9401,$9001,$8c01,$8901,$8601,$8401,$8201,$8101
  303.     dc.w $8001,$8001,$8001,$8001,$8001,$8101,$8201,$8401
  304.     dc.w $8601,$8901,$8c01,$9001,$9401
  305.     dc.w $0000
  306.     
  307. table1:
  308.     dc.w $9c01,$9901,$9601,$9401,$9201,$9101,$9001,$9001
  309.     dc.w $9001,$9001,$9001,$9001,$9001,$9001,$9001,$9101
  310.     dc.w $9201,$9401,$9601,$9901,$9c01
  311.     dc.w $0000
  312.     
  313. table2:
  314.     dc.w $a401,$a201,$a001,$9f01,$9e01,$9e01,$9e01,$9e01
  315.     dc.w $9e01,$9e01,$9e01,$9e01,$9e01,$9e01,$9e01,$9e01
  316.     dc.w $9e01,$9f01,$a001,$a201,$a401
  317.     dc.w $0000
  318.     
  319. table3:
  320.     dc.w $ac01,$ab01,$aa01,$aa01,$aa01,$aa01,$aa01,$aa01
  321.     dc.w $aa01,$aa01,$aa01,$aa01,$aa01,$aa01,$aa01,$aa01
  322.     dc.w $aa01,$aa01,$aa01,$ab01,$ac01
  323.     dc.w $0000
  324.     
  325. table4:
  326.     dc.w $8c01,$8701,$8201,$7e01,$7a01,$7701,$7501,$7301
  327.     dc.w $7101,$7001,$7001,$7001,$7101,$7301,$7501,$7701
  328.     dc.w $7a01,$7e01,$8201,$8701,$8c01
  329.     dc.w $0000
  330.     
  331. table5:
  332.     dc.w $8401,$7e01,$7801,$7301,$6e01,$6a01,$6701,$6401
  333.     dc.w $6201,$6101,$6101,$6101,$6201,$6401,$6701,$6a01,$6e01,$7301
  334.     dc.w $7801,$7e01,$8401
  335.     dc.w $0000
  336.     
  337.     even    
  338.  
  339. bpinit:        lea samples(pc),a0
  340.         lea bpsong(pc),a1
  341.         clr.b numtables
  342.         cmpi.w #'V.',26(a1)
  343.         bne.s bpnotv2
  344.         cmpi.b #'2',28(a1)
  345.         bne.s bpnotv2
  346.         move.b 29(a1),numtables
  347. bpnotv2:    move.l #512,d0
  348.         move.w 30(a1),d1        ;d1 now contains length in steps
  349.         moveq.l #1,d2             ;1 is highest pattern number
  350.         mulu #4,d1             ;4 voices per step
  351.         subq.w #1,d1             ;correction for DBRA
  352. findhighest:    cmp.w (a1,d0),d2        ;Is it higher
  353.         bge.s nothigher            ;No
  354.         move.w (a1,d0),d2        ;Yes, so let D2 be highest
  355. nothigher:    addq.l #4,d0             ;Next Voice
  356.         dbra d1,findhighest        ;And search
  357.         move.w 30(a1),d1
  358.         mulu #16,d1             ;16 bytes per step
  359.         move.l #512,d0             ;header is 512 bytes
  360.         mulu #48,d2             ;48 bytes per pattern
  361.         add.l d2,d0
  362.         add.l d1,d0             ;offset for samples
  363.         add.l #bpsong,d0
  364.         move.l d0,tables
  365.         moveq.l #0,d1
  366.         move.b numtables,d1        ;Number of tables
  367.         lsl.l #6,d1             ;x 64
  368.         add.l d1,d0
  369.         move.l #14,d1             ;15 samples
  370.         add.l #32,a1
  371. initloop:    move.l d0,(a0)+
  372.         cmpi.b #$ff,(a1)
  373.         beq.s bpissynth
  374.         move.w 24(a1),d2
  375.         mulu #2,d2             ;Length is in words
  376.         add.l d2,d0             ;offset next sample
  377. bpissynth:    add.l #32,a1             ;Length of Sample Part in header
  378.         dbra d1,initloop
  379.         rts
  380. bpmusic:    bsr bpsynth
  381.         subq.b #1,arpcount
  382.         moveq.l #3,d0
  383.         lea bpcurrent(pc),a0
  384.         move.l #$dff0a0,a1
  385. bploop1:    move.b 12(a0),d4
  386.         ext.w d4
  387.         add.w d4,(a0)
  388.         tst.b $1e(a0)
  389.         bne.s bplfo
  390.         move.w (a0),6(a1)
  391. bplfo:        move.l 4(a0),(a1)
  392.         move.w 8(a0),4(a1)
  393.         tst.b 11(a0)
  394.         bne.s bpdoarp
  395.         tst.b 13(a0)
  396.         beq.s not2
  397. bpdoarp:    tst.b arpcount
  398.         bne.s not0
  399.         move.b 11(a0),d3
  400.         move.b 13(a0),d4
  401.         and.w #240,d4
  402.         and.w #240,d3
  403.         lsr.w #4,d3
  404.         lsr.w #4,d4
  405.         add.w d3,d4
  406.         add.b 10(a0),d4
  407.         bsr bpplayarp
  408.         bra.s not2
  409. not0:        cmpi.b #1,arpcount 
  410.         bne.s not1
  411.         move.b 11(a0),d3
  412.         move.b 13(a0),d4
  413.         and.w #15,d3
  414.         and.w #15,d4
  415.         add.w d3,d4
  416.         add.b 10(a0),d4
  417.         bsr bpplayarp
  418.         bra.s not2
  419. not1:        move.b 10(a0),d4
  420.         bsr bpplayarp
  421. not2:        lea $10(a1),a1
  422.         lea $20(a0),a0
  423.         dbra d0,bploop1
  424.         tst.b arpcount
  425.         bne.s arpnotzero
  426.         move.b #3,arpcount
  427. arpnotzero:    subq.b #1,bpcount
  428.         beq.s bpskip1
  429.         rts
  430. bpskip1:    move.b bpdelay,bpcount
  431. bpplay:        bsr.s bpnext
  432.         move.w dma,$dff096
  433.         ;move.l #$1f4,d0        ;is this a waste ?????
  434. bpxx:        ;dbra d0,bpxx
  435.         moveq.l #3,d0
  436.         move.l #$dff0a0,a1
  437.         moveq.w #1,d1
  438.         lea bpcurrent(pc),a2
  439.         lea bpbuffer(pc),a5
  440. bploop2:    btst #15,(a2)
  441.         beq.s bpskip7
  442.         bsr bpplayit
  443. bpskip7:    asl.w #1,d1
  444.         lea $10(a1),a1
  445.         lea $20(a2),a2
  446.         lea $24(a5),a5
  447.         dbra d0,bploop2
  448.         rts
  449. bpnext:        clr.w dma
  450.         lea bpsong(pc),a0
  451.         move.l #$dff0a0,a3
  452.         moveq.l #3,d0
  453.         moveq.w #1,d7
  454.         lea bpcurrent(pc),a1
  455. bploop3:    moveq.l #0,d1
  456.         move.w bpstep,d1
  457.         lsl.w #4,d1
  458.         move.l d0,d2
  459.         lsl.l #2,d2
  460.         add.l d2,d1
  461.         add.l #512,d1
  462.         move.w (a0,d1),d2
  463.         move.b 2(a0,d1),st
  464.         move.b 3(a0,d1),tr
  465.         subq.w #1,d2
  466.         mulu #48,d2
  467.         moveq.l #0,d3
  468.         move.w 30(a0),d3
  469.         lsl.w #4,d3
  470.         add.l d2,d3
  471.         move.l #$00000200,d4
  472.         move.b bppatcount,d4
  473.         add.l d3,d4
  474.         move.l d4,a2
  475.         add.l a0,a2
  476.         moveq.l #0,d3 
  477.         move.b (a2),d3
  478.         tst.b d3
  479.         bne.s bpskip4
  480.         bra bpoptionals
  481. bpskip4:    clr.w 12(a1)              ;Clear autoslide/autoarpeggio
  482.         move.b 1(a2),d4
  483.         and.b #15,d4
  484.         cmpi.b #10,d4            ;Option 10->transposes off
  485.         bne.s bp_do1
  486.         move.b 2(a2),d4
  487.         and.b #240,d4              ;Higher nibble=transpose
  488.         bne.s bp_not1
  489. bp_do1:        add.b tr,d3
  490.         ext.w d3
  491. bp_not1:    move.b d3,10(a1)         ; Voor Arpeggio's
  492.         lea bpper(pc),a4
  493.         lsl.w #1,d3
  494.         move.w -2(a4,d3.w),(a1)
  495.         bset #15,(a1)
  496.         move.b #$ff,2(a1)
  497.         moveq.w #0,d3
  498.         move.b 1(a2),d3
  499.         lsr.b #4,d3
  500.         and.b #15,d3
  501.         tst.b d3
  502.         bne.s bpskip5
  503.         move.b 3(a1),d3 
  504. bpskip5:     move.b 1(a2),d4
  505.         and.b #15,d4
  506.         cmpi.b #10,d4             ;option 10
  507.         bne.s bp_do2
  508.         move.b 2(a2),d4
  509.         and.b #15,d4
  510.         bne.s bp_not2
  511. bp_do2:        add.b st,d3
  512. bp_not2:    cmpi.w #1,8(a1)
  513.         beq.s bpsamplechange
  514.         cmp.b 3(a1),d3
  515.         beq.s bpoptionals
  516. bpsamplechange:    move.b d3,3(a1)
  517.         or.w d7,dma
  518. bpoptionals:     moveq.l #0,d3
  519.         moveq.l #0,d4
  520.         move.b 1(a2),d3
  521.         and.b #15,d3
  522.         move.b 2(a2),d4
  523.         cmpi.b #0,d3            ; Optionals Here
  524.         bne.s notopt0
  525.         move.b d4,11(a1)
  526. notopt0:    cmpi.b #1,d3
  527.         bne.s bpskip3
  528.         move.w d4,8(a3)
  529.         move.b d4,2(a1)         ; Volume ook in BPCurrent
  530. bpskip3:    cmpi.b #2,d3              ; Set Speed
  531.         bne.s bpskip9
  532.         move.b d4,bpcount
  533.         move.b d4,bpdelay
  534. bpskip9:    cmpi.b #3,d3             ; Filter = LED control
  535.         bne.s bpskipa
  536.         tst.b d4
  537.         bne.s bpskipb
  538.         bset #1,$bfe001
  539.         bra.s bpskip2
  540. bpskipb:    bclr #1,$bfe001
  541. bpskipa:    cmpi.b #4,d3             ; PortUp
  542.         bne.s noportup
  543.         sub.w d4,(a1)             ; Slide data in BPCurrent
  544.         clr.b 11(a1)             ; Arpeggio's uit
  545. noportup:    cmpi.b #5,d3             ; PortDown
  546.         bne.s noportdn
  547.         add.w d4,(a1)             ; Slide down
  548.         clr.b 11(a1)
  549. noportdn:    cmpi.b #6,d3            ; SetRepCount
  550.         bne.s notopt6
  551.         move.b d4,bprepcount
  552. notopt6:    cmpi.b #7,d3            ; DBRA repcount
  553.         bne.s notopt7
  554.         subq.b #1,bprepcount
  555.         beq.s notopt7
  556.         move.w d4,bpstep
  557. notopt7:    cmpi.b #8,d3            ;Set AutoSlide
  558.         bne.s notopt8
  559.         move.b d4,12(a1)
  560. notopt8:    cmpi.b #9,d3            ;Set AutoArpeggio
  561.         bne.s notopt9
  562.         move.b d4,13(a1)
  563. notopt9:
  564. bpskip2:    lea $10(a3),a3
  565.         lea $20(a1),a1
  566.         asl.w #1,d7
  567.         dbra d0,bploop3   
  568.         addq.b #3,bppatcount
  569.         cmpi.b #48,bppatcount
  570.         bne.s bpskip8
  571.         move.b #0,bppatcount
  572.         addq.w #1,bpstep
  573.         lea bpsong(pc),a0
  574.         move.w 30(a0),d1
  575.         cmp.w bpstep,d1
  576.         bne.s bpskip8
  577.         move.w #0,bpstep
  578. bpskip8:    rts
  579. bpplayit:    bclr #15,(a2)
  580.         tst.l (a5)             ;Was EG used
  581.         beq.s noeg1             ;No ??
  582.         moveq.w #0,d3             ;Well then copy
  583.         move.l (a5),a4             ;Old waveform back
  584.         moveq #7,d7             ;to waveform tables
  585. eg1loop:    move.l 4(a5,d3.w),(a4)+        ;Copy...
  586.         addq.w #4,d3             ;Copy...
  587.         dbra d7,eg1loop            ;Copy...
  588. noeg1:        move.w (a2),6(a1)        ;Period from bpcurrent
  589.         moveq.l #0,d7
  590.         move.b 3(a2),d7            ;Instrument number
  591.         move.l d7,d6             ;Also in d6
  592.         lsl.l #5,d7             ;Header offset    
  593.         lea bpsong(pc),a3
  594.         cmpi.b #$ff,(a3,d7.w)        ;Is synthetic
  595.         beq.s bpplaysynthetic        ;Yes ??
  596.         clr.l (a5)             ;EG Off
  597.         clr.b $1a(a2)             ;Synthetic mode off
  598.         clr.w $1e(a2)             ;Lfo Off
  599.         add.l #24,d7             ;24 is name->ignore
  600.         lsl.l #2,d6             ;x4 for sample offset
  601.         move.l #samples,a4
  602.         move.l -4(a4,d6),d4        ;Fetch sample pointer
  603.         beq.s bp_nosamp            ;is zero->no sample
  604.         move.l d4,(a1)             ;Sample pointer in hardware
  605.         move.w (a3,d7),4(a1)        ;length in hardware
  606.         move.b 2(a2),9(a1)        ;and volume from bpcurrent
  607.         cmpi.b #$ff,2(a2)        ;Use default volume
  608.         bne.s skipxx             ;No ??
  609.         move.w 6(a3,d7),8(a1)        ;Default volume in hardware
  610. skipxx:     move.w 4(a3,d7),8(a2)        ;Length in bpcurrent
  611.         moveq.l #0,d6
  612.         move.w 2(a3,d7),d6        ;Calculate repeat
  613.         add.l d6,d4
  614.         move.l d4,4(a2)            ;sample start in bpcurrent
  615.         cmpi.w #1,8(a2)            ;has sample repeat part
  616.         bne.s bpskip6             ;Yes ??
  617. bp_nosamp:    move.l #null,4(a2)        ;Play no sample
  618.         bra.s bpskip10
  619. bpskip6:    move.w 8(a2),4(a1)        ;Length to hardware
  620.         move.l 4(a2),(a1)        ;pointer to hardware
  621. bpskip10:    or.w #$8000,d1            ;Turn on DMA for this voice
  622.         move.w d1,$dff096        ;Yeah, do it
  623.         rts
  624. bpplaysynthetic:move.b #$1,$1a(a2)        ;Synthetic mode on
  625.         clr.w $e(a2)             ;EG Pointer restart
  626.         clr.w $10(a2)             ;LFO Pointer restart
  627.         clr.w $12(a2)             ;ADSR Pointer restart
  628.         move.w 22(a3,d7.w),$14(a2)    ;EG Delay
  629.         addq.w #1,$14(a2)        ;0 is nodelay
  630.         move.w 14(a3,d7.w),$16(a2)    ;LFO Delay
  631.         addq.w #1,$16(a2)        ;So I need correction
  632.         move.w #1,$18(a2)        ;ADSR Delay->Start immediate
  633.         move.b 17(a3,d7.w),$1d(a2)    ;EG OOC
  634.         move.b 9(a3,d7.w),$1e(a2)    ;LFO OOC
  635.         move.b 4(a3,d7.w),$1f(a2)    ;ADSR OOC
  636.         move.b 19(a3,d7.w),$1c(a2)    ;Current EG Value
  637.         move.l tables,a4        ; so far so good,now what ??
  638.         moveq.l #0,d3            ;Pointer to waveform tables
  639.         move.b 1(a3,d7.w),d3        ;Which waveform
  640.         lsl.l #6,d3             ;x64 is length waveform table
  641.         add.l d3,a4
  642.         move.l a4,(a1)             ;Sample Pointer
  643.         move.l a4,4(a2)            ;In bpcurrent
  644.         move.w 2(a3,d7.w),4(a1)        ;Length in words
  645.         move.w 2(a3,d7.w),8(a2)        ;Length in bpcurrent
  646.         tst.b 4(a3,d7.w)        ;Is ADSR on
  647.         beq.s bpadsroff            ;No ??
  648.         move.l tables,a4        ;Tables
  649.         moveq.l #0,d3
  650.         move.b 5(a3,d7.w),d3        ;ADSR table number
  651.         lsl.l #6,d3             ;x64 for length
  652.         add.l d3,a4             ;Add it
  653.         moveq.w #0,d3
  654.         move.b (a4),d3             ;Get table value
  655.         add.b #128,d3             ;I want it from 0..255
  656.         lsr.w #2,d3             ;Divide by 4->0..63
  657.         cmpi.b #$ff,2(a2)
  658.         bne.s bpskip99
  659.         move.b 25(a3,d7.w),2(a2)
  660. bpskip99:    moveq.w #0,d4
  661.         move.b 2(a2),d4            ;Default volume
  662.         mulu d4,d3             ;default maal init volume
  663.         lsr.w #6,d3             ;divide by 64
  664.         move.w d3,8(a1)            ;is new volume
  665.         bra.s bpflipper
  666. bpadsroff:    move.b 2(a2),9(a1)
  667.         cmpi.b #$ff,2(a2)
  668.         bne.s bpflipper            ;No ADSR
  669.         move.b 25(a3,d7.w),9(a1)    ;So use default volume
  670. bpflipper:    move.l 4(a2),a4            ;Pointer on waveform
  671.         move.l a4,(a5)             ;Save it
  672.         moveq.w #0,d3             ;Save Old waveform
  673.         moveq #7,d4             ;data in bpbuffer
  674. eg2loop:    move.l (a4,d3.w),4(a5,d3.w)
  675.         addq.w #4,d3             ;Copy         
  676.         dbra d4,eg2loop
  677.         tst.b 17(a3,d7.w)        ;EG off
  678.         beq bpskip10            ;Yes ??
  679.         tst.b 19(a3,d7.w)        ;Is there an init value for EG
  680.         beq bpskip10            ;No ??
  681.         moveq.l #0,d3
  682.         move.b 19(a3,d7.w),d3
  683.         lsr.l #3,d3             ;Divide by 8 ->0..31
  684.         move.b d3,$1c(a2)        ;Current EG Value
  685.         subq.l #1,d3             ;-1,DBRA correction
  686. eg3loop:    neg.b (a4)+
  687.         dbra d3,eg3loop
  688.         bra bpskip10
  689. bpplayarp:    lea bpper(pc),a4
  690.         ext.w d4
  691.         asl.w #1,d4
  692.         move.w -2(a4,d4.w),6(a1)
  693.         rts
  694. bpsynth:    move.l #3,d0
  695.         lea bpcurrent(pc),a2
  696.         lea $dff0a0,a1
  697.         lea bpsong(pc),a3
  698.         lea bpbuffer(pc),a5
  699. bpsynthloop:    tst.b $1a(a2)             ;Is synthetic sound
  700.         beq.s bpnosynth            ;No ??
  701.         bsr.s bpyessynth            ;Yes         
  702. bpnosynth:    lea $24(a5),a5
  703.         lea $20(a2),a2
  704.         lea $10(a1),a1
  705.         dbra d0,bpsynthloop
  706.         rts
  707. bpyessynth:    moveq.w #0,d7
  708.         move.b 3(a2),d7            ;Which instr. was I playing
  709.         lsl.w #5,d7             ;x32, is length of instr.
  710.         tst.b $1f(a2)             ;ADSR off
  711.         beq.s bpendadsr            ;Yes ??
  712.         subq.w #1,$18(a2)        ;Delay,May I
  713.         bne.s bpendadsr            ;No ??
  714.         moveq.l #0,d3
  715.         move.b 8(a3,d7.w),d3
  716.         move.w d3,$18(a2)        ;Reset Delay Counter
  717.         move.l tables,a4
  718.         move.b 5(a3,d7.w),d3        ;Which ADSR table
  719.         lsl.l #6,d3             ;x64
  720.         add.l d3,a4             ;This is my table
  721.         move.w $12(a2),d3        ;Get ADSR table pointer
  722.         moveq.w #0,d4
  723.         move.b (a4,d3.w),d4        ;Value from table
  724.         add.b #128,d4             ;Want it from 0..255
  725.         lsr.w #2,d4             ;And now from 0..63
  726.         moveq.w #0,d3
  727.         move.b 2(a2),d3            ;Current Volume
  728.         mulu d3,d4             ;MultiPly with table volume
  729.         lsr.w #6,d4             ;Divide by 64=New volume
  730.         move.w d4,8(a1)            ;Volume in hardware
  731.         addq.w #1,$12(a2)        ;Increment of ADSR pointer
  732.         move.w 6(a3,d7.w),d4        ;Length of adsr table
  733.         cmp.w $12(a2),d4        ;End of table reached
  734.         bne.s bpendadsr            ;No ??
  735.         clr.w $12(a2)             ;Clear ADSR Pointer
  736.         cmpi.b #1,$1f(a2)        ;Once
  737.         bne.s bpendadsr            ;No ??
  738.         clr.b $1f(a2)             ;ADSR off
  739. bpendadsr:    tst.b $1e(a2)             ;LFO On
  740.         beq.s bpendlfo            ;No ??
  741.         subq.w #1,$16(a2)        ;LFO delay,May I
  742.         bne.s bpendlfo            ;No
  743.         moveq.l #0,d3
  744.         move.b 16(a3,d7.w),d3
  745.         move.w d3,$16(a2)        ;Set LFO Count
  746.         move.l tables,a4
  747.         move.b 10(a3,d7.w),d3        ;Which LFO table
  748.         lsl.l #6,d3             ;x64
  749.         add.l d3,a4
  750.         move.w $10(a2),d3        ;LFO pointer
  751.         moveq.l #0,d4
  752.         move.b (a4,d3.w),d4        ;That's my value
  753.         ext.w d4             ;Make it a word
  754.         ext.l d4             ;And a longword
  755.         moveq.l #0,d5
  756.         move.b 11(a3,d7.w),d5        ;LFO depth
  757.         tst.b d5
  758.         beq.s bpnotx
  759.         divs d5,d4             ;Calculate it
  760. bpnotx:        move.w (a2),d5             ;Period
  761.         add.w d4,d5             ;New Period
  762.         move.w d5,6(a1)            ;In hardware
  763.         addq.w #1,$10(a2)        ;Next position
  764.         move.w 12(a3,d7.w),d3        ;LFO table Length
  765.         cmp.w $10(a2),d3        ;End Reached
  766.         bne.s bpendlfo            ;NO ??
  767.         clr.w $10(a2)             ;Reset LFO Pointer
  768.         cmpi.b #1,$1e(a2)        ;Once LFO
  769.         bne.s bpendlfo            ;NO ??
  770.         clr.b $1e(a2)             ;LFO Off
  771. bpendlfo:    tst.b $1d(a2)             ;EG On
  772.         beq bpendeg             ;No ??
  773.         subq.w #1,$14(a2)        ;EG delay,May I
  774.         bne bpendeg             ;No
  775.         tst.l (a5)
  776.         beq.s bpendeg
  777.         moveq.l #0,d3
  778.         move.b 24(a3,d7.w),d3
  779.         move.w d3,$14(a2)        ;Set EG Count
  780.         move.l tables,a4
  781.         move.b 18(a3,d7.w),d3        ;Which EG table
  782.         lsl.l #6,d3             ;x64
  783.         add.l d3,a4
  784.         move.w $e(a2),d3        ;EG pointer
  785.         moveq.l #0,d4
  786.         move.b (a4,d3.w),d4        ;That's my value
  787.         move.l (a5),a4             ;Pointer to waveform
  788.         add.b #128,d4             ;0..255
  789.         lsr.l #3,d4             ;0..31
  790.         moveq.l #0,d3
  791.         move.b $1c(a2),d3        ;Old EG Value
  792.         move.b d4,$1c(a2)
  793.         add.l d3,a4             ;WaveForm Position
  794.         move.l a5,a6             ;Buffer
  795.         add.l d3,a6             ;Position
  796.         addq.l #4,a6             ;For adress in buffer
  797.         cmp.b d3,d4             ;Compare old with new value
  798.         beq.s bpnexteg            ;no change ??
  799.         bgt bpishigh            ;new value is higher
  800. bpislow:    sub.l d4,d3             ;oldvalue-newvalue
  801.         subq.l #1,d3             ;Correction for DBRA
  802. bpegloop1a:    move.b -(a6),d4
  803.         move.b d4,-(a4)
  804.         dbra d3,bpegloop1a  
  805.         bra.s bpnexteg
  806. bpishigh:    sub.l d3,d4             ;Newvalue-oldvalue
  807.         subq.l #1,d4             ;Correction for DBRA
  808. bpegloop1b:    move.b (a6)+,d3
  809.         neg.b d3
  810.         move.b d3,(a4)+            ;DoIt
  811.         dbra d4,bpegloop1b
  812. bpnexteg:    addq.w #1,$e(a2)        ;Next position
  813.         move.w 20(a3,d7.w),d3        ;EG table Length
  814.         cmp.w $e(a2),d3            ;End Reached
  815.         bne.s bpendeg             ;NO ??
  816.         clr.w $e(a2)             ;Reset EG Pointer
  817.         cmpi.b #1,$1d(a2)        ;Once EG
  818.         bne.s bpendeg             ;NO ??
  819.         clr.b $1d(a2)             ;EG Off
  820. bpendeg:    rts
  821.  
  822. null:        dc.w 0
  823. bpcurrent:    dc.w 0,0            ;periode,instrument =(volume.b,instr nr.b)
  824.         dc.l null            ;start
  825.         dc.w 1                ;length (words)
  826.         dc.b 0,0,0,0             ;noot,arpeggio,autoslide,autoarpeggio
  827.         dc.w 0,0,0            ;EG,LFO,ADSR pointers
  828.         dc.w 0,0,0            ;EG,LFO,ADSR count
  829.         dc.b 0,0            ;Synthetic yes/no, Volume Slide
  830.         dc.b 0,0            ;Current EG value,EG OOC
  831.         dc.b 0,0            ;LFO OOC,ADSR OOC
  832.  
  833.         dc.w 0,0
  834.         dc.l null
  835.         dc.w 1,0,0
  836.         dc.w 0,0,0,0,0,0,0,0,0
  837.  
  838.         dc.w 0,0
  839.         dc.l null
  840.         dc.w 1,0,0
  841.         dc.w 0,0,0,0,0,0,0,0,0
  842.  
  843.         dc.w 0,0
  844.         dc.l null
  845.         dc.w 1,0,0
  846.         dc.w 0,0,0,0,0,0,0,0,0
  847.  
  848. bpstep:        dc.w 0
  849. bppatcount:    dc.b 0
  850. st:        dc.b 0
  851. tr:        dc.b 0
  852. bpcount:    dc.b 1
  853. bpdelay:    dc.b 6
  854. arpcount:    dc.b 1
  855. bprepcount:    dc.b 1
  856. numtables:    dc.b 0
  857.  
  858.         even
  859.  
  860. dma:        dc.w 0
  861. tables:        dc.l 0
  862.  
  863. bpbuffer:    dcb.b 144,0
  864.         dc.w 6848,6464,6080,5760,5440,5120,4832,4576,4320,4064,3840,3616
  865.         dc.w 3424,3232,3040,2880,2720,2560,2416,2288,2160,2032,1920,1808
  866.         dc.w 1712,1616,1520,1440,1360,1280,1208,1144,1080,1016,0960,0904
  867.  
  868. bpper:        dc.w 0856,0808,0760,0720,0680,0640,0604,0572,0540,0508,0480,0452
  869.         dc.w 0428,0404,0380,0360,0340,0320,0302,0286,0270,0254,0240,0226
  870.         dc.w 0214,0202,0190,0180,0170,0160,0151,0143,0135,0127,0120,0113
  871.         dc.w 0107,0101,0095,0090,0085,0080,0076,0072,0068,0064,0060,0057
  872.  
  873. samples:    dcb.l 15,0
  874.  
  875. bpsong:        incbin "df1:modules/bp.liverpool"
  876.  
  877.         
  878.  
  879.